package orders;

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;

import java.util.Collection;
import java.util.LinkedHashSet;

/**
 * @author XiaoDongLei
 * @Package com.vonzhou.springinaction.knights
 * @date 2018/4/1
 * @Description: 12.1.2　为模型添加注解，实现MongoDB持久化
 * <p>
 * 1、MongoDB并没有提供对象-文档映射的注解。Spring Data MongoDB填补了这一空白，提供了一些将Java类型映射为MongoDB文档的注解。
 * 用于对象-文档映射的Spring Data MongoDB注解：
 * 1、@Document 标示映射到MongoDB文档上的领域对象。
 * 2、@Id 标示某个域为ID域。
 * 3、@DbRef 标示某个域要引用其他的文档，这个文档有可能位于另外一个数据库中。
 * 4、@Field 为文档域指定自定义的元数据。
 * 5、@Version 标示某个属性用作版本域。
 * <p>
 * 2、@Document和@Id注解类似于JPA的@Entity和@Id注解。我们将会经常使用这两个注解，对于要以文档形式保存到MongoDB数据库的每个Java类型都会使用这两个注解。
 * <p>
 * Order类添加了@Document注解，这样它就能够借助MongoTemplate或自动生成的Repository进行持久化。其id属性上使用了@Id注解，用来指定它作为文档的ID。除此之
 * 外，customer属性上使用了@Field注解，这样的话，当文档持久化的时候customer属性将会映射为名为client的域。
 * <p>
 * 注意，其他的属性并没有添加注解。除非将属性设置为瞬时态（transient）的，否则Java对象中所有的域都会持久化为文档中的域。并且如果我们不使用@Field注解进行设置的话，那么文档域中的名字将会与对应的Java属性相同。
 * <p>
 * 同时，需要注意的是items属性，它指的是订单中具体条目的集合。在传统的关系型数据库中，这些条目将会保存在另外的一个数据库表中，通过外键进行应用，items域上很可能还会使用JPA的@OneToMany注解。但在这里，情形完全不同。
 * <p>
 * 我们没有必要为Item添加@Document注解，也没有必要为它的域指定@Id。这是因为我们不会单独将Item持久化为文档。它始终会是Order文档中Item列表的一个成员，并且会作为文档中的嵌入元素。
 * <p>
 * 当然，如果你想指定Item中的某个域如何持久化到文档中，那么可以为对应的Item属性添加@Field注解。不过在本例中，并没有必要这样做。
 * <p>
 * 我们现在已经为Java对象添加了MongoDB持久化的注解。接下来，看一下如何使用MongoTemplate来存储它们。
 */
//这是一个文档
@Document
public class Order {

	@Id
	private String id;

	/**
	 * 覆盖默认的域名
	 */
	@Field("customer")
	private String customer;

	private String type;

	private Collection<Item> items = new LinkedHashSet<Item>();

	public String getCustomer() {
		return customer;
	}

	public void setCustomer(String customer) {
		this.customer = customer;
	}

	public String getType() {
		return type;
	}

	public void setType(String type) {
		this.type = type;
	}

	public Collection<Item> getItems() {
		return items;
	}

	public void setItems(Collection<Item> items) {
		this.items = items;
	}

	public String getId() {
		return id;
	}

}
